Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Problem] Rysowanie punktów GDI+


Rekomendowane odpowiedzi

Opublikowano

Witam

 

Następujący problem - Próbowałem napisać programik który będzie losował kolor i piksel po pikselu rysował punkt na GUI z tym kolorem.

W kodzie widać więcej.

 

Nie działa następujący fragment:

Local $kolor = '', $i = 0

   For $x = 1 To 600 Step +1
       For $y = 1 To 500 Step +1
           For $a = 1 to 6 Step +1
               $kolor &= $znaki[Random(0, 15, 1)]
           Next
           _GDIPlus_PenSetColor($hPen, "0x00"&$kolor)
           ToolTip($x&@CRLF&$y)
           _GDIPlus_GraphicsDrawRect($hGFX, $x+$i, $y+$i, 1, 1, $hPen)
           $i += 1
           SRandom($seed+1)
       Next
   Next

 

A oto cały kod:

 

;##### INCLUDE #####
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>

Opt("GuiOnEventMode", 1) ;Uruchomienie trybu OnEvent

;tablica ze znakami do generowania kolorów - upycham tutaj zeby nie deklarować jej za kazdym wywołaniem funkcji
Global $znaki[16] = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F']

;##### GUI #####
$GraphGUI = GUICreate("Generator", 600, 500) ;GUI w którym będzie generowany rysunek

$OptGUI = GUICreate("Ustawienie generowania", 386, 95, 5, 5) ;GUI z ustawieniami generowania
$InWyrazenie = GUICtrlCreateInput("", 8, 32, 369, 21) ;Input z wyrazeniem
$label = GUICtrlCreateLabel("Wpisz poniżej wyrażenie na podstawie którego program wygeneruje obrazek", 8, 8, 363, 17)
$bInfo = GUICtrlCreateButton("Informacje", 312, 56, 67, 17)
$bWyczysc = GUICtrlCreateButton("Wyczysć", 8, 64, 75, 25)
$bGeneruj = GUICtrlCreateButton("Generuj", 96, 64, 75, 25)
$bZakoncz = GUICtrlCreateButton("Zakończ", 184, 64, 75, 25)

;### GUISETONEVENT ###
GUISetOnEvent($GUI_EVENT_CLOSE, "wyjscie", $GraphGUI)
GUISetOnEvent($GUI_EVENT_CLOSE, "wyjscie", $OptGUI)

;### GUICTRLSETONEVENT ###
GUICtrlSetOnEvent($bInfo, "informacje")
GUICtrlSetOnEvent($bWyczysc, "wyczysc")
GUICtrlSetOnEvent($bGeneruj, "generuj")
GUICtrlSetOnEvent($bZakoncz, "wyjscie")

;### POKAZANIE GUI ###
GUISetState(@SW_SHOW, $GraphGUI)
GUISetState(@SW_SHOW, $OptGUI)

;### URUCHOMIENIE GDI+ ###
_GDIPlus_Startup()
Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($GraphGUI)
Global $hPen = _GDIPlus_PenCreate()
_GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)

;##### FUNKCJE #####
Func wyjscie() ;wyjscie z programu
   _GDIPlus_PenDispose($hPen)
   _GDIPlus_GraphicsDispose($hGFX)
   _GDIPlus_Shutdown()
   Exit
EndFunc

Func informacje() ;msgbox z informacjami
   MsgBox(64, "Informacje", "GDI+ Generator by Phoenix_PL"&@CRLF& _
   "Stworzono dla MPCForum"&@CRLF&@CRLF& _
   "Wyrazeniem moze być:"&@CRLF& _
   "- Dowolne działanie matematyczne (dodawanie (+), odejmowanie (-), dzielenie (/), mnozenie (*), potęgi (^))"&@CRLF& _
   "- Funkcja AutoIT (dowolna, musi tylko cos zwracać)"&@CRLF& _
   "Wykozystane jest polecenie Execute dla wpisanego tekstu."&@CRLF& _
   "Po więcej info SciTE -> F1 -> Execute") ;msgbox z informacją
EndFunc

Func wyczysc() ;czyszczenie grafiki
   _GDIPlus_GraphicsClear($hGFX, 0xFFFFFFFF)
EndFunc

Func generuj() ;generowanie grafiki - NIE DZIAŁA!!!
   ;ustawienie seeda dla funkcji Random - dzięki niej kazdy wynik wylosuje co innego, ale jesli wynik sie powtorzy to
   ;obrazek będzie identyczny.
   ;Na przykład, ktos poda liczbe 12 - wygeneruje obrazek. I przy kazdym uzyciu liczby 12 będzie ten sam obrazek.
   $seed = Execute(GUICtrlRead($InWyrazenie))
   SRandom($seed)

   Local $kolor = '', $i = 0

   For $x = 1 To 600 Step +1
       For $y = 1 To 500 Step +1
           For $a = 1 to 6 Step +1
               $kolor &= $znaki[Random(0, 15, 1)]
           Next
           _GDIPlus_PenSetColor($hPen, "0x00"&$kolor)
           ToolTip($x&@CRLF&$y)
           _GDIPlus_GraphicsDrawRect($hGFX, $x+$i, $y+$i, 1, 1, $hPen)
           $i += 1
           SRandom($seed+1) ;dziwnym cudem cały czas był jeden kolor...
       Next
   Next
EndFunc

While 1
   Sleep (100)
WEnd

 

 

Czego użyłem GraphicsDrawRect? Bo kiedy próbowałem rysować linię, nie rysowało jej.

 

Jakieś pomysły czego nie działa?

846331404756772371599.jpeg
Opublikowano

robisz coś takiego

"0x00"&$kolor

czyli jeśli $kolor będzie 14 to wynikowo wyjdzie

"0x0014"

nie wiem co chcesz tym osiągnąć.

 

$kolor = random(0, 256^3-1,1); bo tyle jest możliwych kolorów bez kanału alfa
_GDIPlus_PenSetColor($hPen, $kolor)

 

 

 

SRandom($seed+1)

rób to raz na początku, bo takie cosik nie ma sensu

 

PS. agression kiedyś wrzucił skrypt z dodatkową funkcją z dllcall funkcji setPixel z biblioteki gdiplus. Poszukaj tego, jest gdzieś w dziale z gotowymi skryptami.

Opublikowano

Nie ta pętla losująca kolor jest niepotrzebna, przecież doskonale działa Random(0, 16777215, 1), które było w kodzie który Ci podałem wczoraj.

Nawet jakiś 0x jest niepotrzebny, można przecież podawać liczby dziesiętne zamiast szesnastkowych(czyli jak zrobisz GUICtrlSetBkColor(-1, 255) to się ustawi niebieski). Szesnastkowe są dla ułatwienia żebyś od razu po zerknięciu na zapis mógł sobie wyobrazić ten kolor. A to dlaczego tak jest możemy wywnioskować z tego że komputery liczą binarnie więc liczby szesnastkowe są im bliższe niż dziesiętne.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

A widzisz, dzięki za informacje... jakieś jeszcze pomysły?

 

APO: Kolega wefhy wpadł na pomysł tworzenia labeli o wielkości 1x1 i zmieniania im tła.

Pytanie - Czemu po stworzeniu iluśtamset labeli program się zwiesza?

Memory overload, czy co?

846331404756772371599.jpeg
Opublikowano

AutoIt co prawda pozwala na nieskończoną ilość GUI, ale jedynie na 65532 kontrolek czyli maksymalna wielkość okienka wypełnionego labelami 1x1 to mniej wiecej 256x256(czy tam trochę mniej o piksel). Wiedziałem o tym, ale i tak generowanie zbyt dużej liczby trwa za długo. Trzeba to zrobić w GDI+ i w dodatku wymyślić inną metodę generowania.

Law of Revelation: The hidden flaw never remains hidden.

Opublikowano

Możesz to rysować tak:

#include <GDIplus.au3>

$hGUI = GUICreate("Pixels", 512, 512)
GUISetState()
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)

$pen = _GDIPlus_PenCreate(random(0, 16777215, 1), 2)

for $i = 0 to 511
for $j = 0 to 511
_GDIPlus_GraphicsDrawRect($hGraphics, $i, $j, 1, 1, $pen)
_GDIPlus_PenSetColor($pen, 0xFF000000 + random(0, 0xFFFFFF, 1))
Next
Next

while GUIGetMsg() <> -3


WEnd

 

Ale widzisz jak wolno ;] Może po pixelu będzie szybciej, ale i tak niewiele.. Pytanie czy za każdym razem kolory muszą być różne, czy wystarczy Ci, że będziesz miał względnie je pomieszane, czyli robisz to raz, zapisujesz jako obrazek i przy starcie programu łądujesz

 

@Sopelek

W Pen color masz jeszcze wartość kanału alpha, więc musisz dodać to 0xFF000000 ;)

Opublikowano

" Czemu po stworzeniu iluśtamset labeli program się zwiesza? "

Bo słuchasz się jakichś poronionych pomysłów. Bo to to to inaczej nie można tego nazwać.

 

W informatyce nie ma czegoś takiego jak nieskończoność. Operuj terminami "dostatecznie dużo" i "beztrosko dużo".

 

http://www.mpcforum....rowka-langtona/

Enjoy!

 

Sopelek mówił o http://www.mpcforum....okna-lub-pliku/

ale operując na graphicsContext chyba jest szybciej, ale pomijalnie...

Jeśli potrzebujesz szybciej musisz skorzystać z poważniejszego języka ( np. C++ ). Dołączasz sobie do tego biblioteczkę, np. wxWidgets, i masz bardzo przyjemne, szybkie, obiektowe rysowanie bez konieczności zaprzątania sobie głowy bzdurkami z WinApi.

Ta sygnatura jest pusta.

Opublikowano

Dobra, agresor, dzięki za informacje :P

Wiem że w końcu się wywiesza, i że nie ma takiego czegoś jak nieskończoność w informatyce bo coś się zawsze przeciąży :)

Ale chciałem tak dla zabawy stworzyć taki skrypcik i zobaczyć jak (i czy) będzie śmigał :)

Dzięki za odpowiedzi, macie po lajku, temat do zamknięcia.

846331404756772371599.jpeg
Opublikowano

No to pobaw się tą mrówką langdona ;)

 

To o nieskończoności było do postu @wefhy.

 

 

Albo jeszcze lepiej, naucz się tego c++ bo widziałem, że zaczynasz.

Ta sygnatura jest pusta.

Opublikowano

Wiem, że nie ma nieskończoności, ale ja przepisuję to co jest napisane w helpie - teoretycznie nieskończoność i praktycznie właściwie też, tylko trzeba komponentów i systemu. Sam AutoIt chyba tutaj nie ma ograniczeń(ogranicza system, wielkość monitora i komponenty).

Mrówka ciekawa, ale nie mogę pojąć, w jaki sposób osiągnąłeś taką prędkość. Szkoda, że przy kilkuset mrówkach już wolno chodzą. Próbowałeś to przepisać na szybszy język?

Law of Revelation: The hidden flaw never remains hidden.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...